#!/usr/bin/env python
# -*- coding: utf-8 -*-

#作者: 徐晨阳
#邮箱: xuender@gmail.com
#日期: 2007-06-25
import os,sys

class iconv:
	'''编码转换对象'''
	def __init__(self,from_code='gbk',to_code='utf-8',from_file=None,to_file=None):
		self.fc=from_code
		self.tc=to_code
		self.ff=from_file
		self.tf=to_file
	
	def help(self,i=0):
		'''显示帮助信息'''
		if i==0:
			print '''Usage: piconv [选项...] [文件或目录]

 输入/输出格式规范
  -f, --from-code=NAME       原始文本编码
  -t, --to-code=NAME         输出编码

输出控制:
  -o, --output=FILE          输出文件或目录

'''
		elif i==1:
			print '原始编码错误，请设置参数-f=xxx'
		elif i==2:
			print '输出编码错误，请设置参数-t=xxx'
		elif i==3:
			print '目标文件不能为空'
		sys.exit()

	def check(self):
		'''检查必要的参数'''
		if self.fc==None: 
			self.help(1)
		if self.tc==None: 
			self.help(2)
		if self.ff==None:
			self.help(3)
		
	def outFile(self,from_file,to_file):
		'''生成文件'''
		print "修改文件"+from_file
		if to_file==None :
			#没有输出文件就覆盖原文件
			print 'iconv %s %s %s -o/tmp/piconv.tmp'%(self.fc,self.tc,from_file)
			os.system('iconv %s %s %s -o/tmp/piconv.tmp'%(self.fc,self.tc,from_file))
			print 'mv /tmp/piconv.tmp %s'%(from_file)
			os.system('mv /tmp/piconv.tmp %s'%(from_file))
		elif os.path.isdir(to_file):
			#输出文件是目录
			print 'iconv %s %s %s -o%s%s%s'%(self.fc,self.tc,from_file,to_file,os.sep,os.path.basename(self.ff))
			os.system('iconv %s %s %s -o%s%s%s'%(self.fc,self.tc,from_file,to_file,os.sep,os.path.basename(self.ff)))
		else:
			#输出文件
			print 'iconv %s %s %s -o%s'%(self.fc,self.tc,from_file,to_file)
			os.system('iconv %s %s %s -o%s'%(self.fc,self.tc,from_file,to_file))
	
	def out(self):
		'''输出'''
		#检查
		self.check()
		if os.path.isfile(self.ff):
			self.outFile(self.ff,self.tf)
		elif os.path.isdir(self.ff):
			self.outDir(self.ff,self.tf)
	
	def outDir(self,dir,dir2):
		'''目录输出'''
		print '操作目录'+dir
		for i in os.listdir(dir):
			name="%s%s%s"%(dir,os.sep,i)
			name2="%s%s%s"%(dir2,os.sep,i)
			if os.path.isfile(name):
				self.outFile(name,name2)
			elif os.path.isdir(name):
				#递归
				if not os.path.isdir(name2):
					print '创建目录 '+name2
					os.mkdir(name2)
				self.outDir(name,name2)

if __name__ == '__main__':
	#sys.argv=['-f=gbk','-t=utf-8','/tmp/a','-o=/tmp/b']
	
	#创建对象
	ic=iconv()
	
	#检查参数
	if len(sys.argv) < 3:
		ic.help()

	for i in sys.argv:
		if '-f' in i or '--from-code' in i:
			ic.fc=i
		elif '-t' in i or '--to-code' in i:
			ic.tc=i
		elif '-o' in i or '---output' in i:
			ic.tf=i[i.find('=')+1:]
		else:
			ic.ff=i
	#输出		
	ic.out()